package com.microtf.inscription.framework.pojo.wechat.listener;

import com.microtf.inscription.framework.pojo.wechat.input.ImageMessage;
import com.microtf.inscription.framework.pojo.wechat.input.LinkMessage;
import com.microtf.inscription.framework.pojo.wechat.input.LocationMessage;
import com.microtf.inscription.framework.pojo.wechat.input.ShortVideoMessage;
import com.microtf.inscription.framework.pojo.wechat.input.TextMessage;
import com.microtf.inscription.framework.pojo.wechat.input.VideoMessage;
import com.microtf.inscription.framework.pojo.wechat.input.VoiceMessage;
import com.microtf.inscription.framework.pojo.wechat.input.event.ClickEvent;
import com.microtf.inscription.framework.pojo.wechat.input.event.LocationEvent;
import com.microtf.inscription.framework.pojo.wechat.input.event.ScanEvent;
import com.microtf.inscription.framework.pojo.wechat.input.event.SubscribeEvent;
import com.microtf.inscription.framework.pojo.wechat.input.event.UnsubscribeEvent;
import com.microtf.inscription.framework.pojo.wechat.input.event.ViewEvent;
import com.microtf.inscription.framework.pojo.wechat.output.Message;

import java.util.Optional;

/**
 * 消息监听
 * @author guliuzhong
 */
public interface EventListener {
    /**
     * 订阅事件
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param event 订阅事件
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onEvent(SubscribeEvent event) { return Optional.empty();}

    /**
     * 取消订阅
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param event 取消订阅
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onEvent(UnsubscribeEvent event) {return Optional.empty();}

    /**
     * 上报地理位置事件
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param event 上报地理位置
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onEvent(LocationEvent event) {return Optional.empty();}

    /**
     * 扫描带参数二维码事件
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param event 扫描带参数二维码事件
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onEvent(ScanEvent event) {return Optional.empty();}

    /**
     * 点击菜单跳转链接时的事件推送
     * @param event 点击菜单跳转链接时的事件推送
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onEvent(ViewEvent event) {return Optional.empty();}

    /**
     * 自定义菜单事件
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param event 自定义菜单事件
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onEvent(ClickEvent event) {return Optional.empty();}

    /**
     * 文本消息
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param message 文本消息
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onMessage(TextMessage message) {return Optional.empty();}

    /**
     * 图片消息
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param message 图片消息
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onMessage(ImageMessage message) {return Optional.empty();}

    /**
     * 链接消息
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param message 链接消息
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onMessage(LinkMessage message) {return Optional.empty();}

    /**
     * 地理位置消息
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param message 地理位置消息
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onMessage(LocationMessage message) {return Optional.empty();}

    /**
     * 小视频消息
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param message 小视频消息
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onMessage(ShortVideoMessage message) {return Optional.empty();}

    /**
     * 语音消息
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param message 语音消息
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onMessage(VoiceMessage message) {return Optional.empty();}

    /**
     * 视频消息
     * <p>返回 {@link com.microtf.inscription.framework.pojo.wechat.output.Message}或他的子类</p>
     * @param message 视频消息
     * @param <T> Message的子类
     * @return 回复微信端的消息
     */
    default <T extends Message> Optional<T> onMessage(VideoMessage message) {return Optional.empty();}
}
